#include <iostream>
#include <vector>
#include <cassert>

using namespace std;

/**
 * 滑动窗口的另一个实现, 求最长字符串长度
 * [O(len(s), O(len(charset)))]	
 */
class Solution{
	public:
		int lengthOfLongestSubstring(string s) {
			int freq[256] = {0};	// 记录重复字符

			int l = 0, r = -1; //滑动窗口为s[l...r]
			int res = 0;

			while(r + 1 < s.size()){

				while(r + 1 < s.size() && freq[s[r+1]] == 0)
					freq[s[++r]] ++;

				res = max(res, r-l+1);
				if(r + 1 < s.size()){
					freq[s[++r]] ++;
					assert(freq[s[r]] == 2);
					while(l <= r && freq[s[r]] == 2){
						freq[s[l++]] --;
					}
				}
			}

			return res;
		}

};
